package com.ruoyi.travel.service.impl;

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.travel.domain.TravelConsult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.travel.mapper.TravelScheduleMapper;
import com.ruoyi.travel.domain.TravelSchedule;
import com.ruoyi.travel.service.ITravelScheduleService;

@Service
public class TravelScheduleServiceImpl implements ITravelScheduleService {
    @Autowired
    private TravelScheduleMapper travelScheduleMapper;

    /**
     * 查询行程管理
     *
     * @param scheduleId 行程管理主键
     * @return 行程管理
     */
    @Override
    public TravelSchedule selectTravelScheduleByScheduleId(Long scheduleId) {
        return travelScheduleMapper.selectTravelScheduleByScheduleId(scheduleId);
    }

    /**
     * 查询行程管理列表
     *
     * @param travelSchedule 行程管理
     * @return 行程管理
     */
    @Override
    public List<TravelSchedule> selectTravelScheduleList(TravelSchedule travelSchedule) {
//        travelSchedule.setUserId(SecurityUtils.getUserId());
//        if (SecurityUtils.isAdmin(SecurityUtils.getUserId())) {
//            travelSchedule.setUserRoleName("admin");
//        } else if (SecurityUtils.hasRole("地陪")) {
//            travelSchedule.setUserRoleName("地陪");
//        } else if (SecurityUtils.hasRole("定制师")) {
//            travelSchedule.setUserRoleName("定制师");
//        } else if (SecurityUtils.hasRole("客服")) {
//            travelSchedule.setUserRoleName("客服");
//        }
        return travelScheduleMapper.selectTravelScheduleList(travelSchedule);
    }

    /**
     * 新增行程管理
     *
     * @param travelSchedule 行程管理
     * @return 结果
     */
    /*
    在插入新数据时需要检查数据库中是否存在相同咨询号且is_deleted=1的记录，如果存在则将其is_deleted更新为 2
     */
    @Override
    public int insertTravelSchedule(TravelSchedule travelSchedule) {
        // 生成 consultNumber：zx + 时间戳 (毫秒)+ 四位随机数
        StringBuilder scheduleNumber = new StringBuilder();
        scheduleNumber.append("xc"); // 固定前缀
        scheduleNumber.append(System.currentTimeMillis()); // 毫秒级时间戳
// 生成四位随机数（0000-9999）
        Random random = new Random();
        int randomNum = random.nextInt(10000);
        scheduleNumber.append(String.format("%04d", randomNum)); // 不足四位补 0
// 设置生成的编号到实体类
        travelSchedule.setScheduleNumber(scheduleNumber.toString());
        // 把旧数据（is_deleted=1）统一改为 2
        travelScheduleMapper.updateOldDeletedTo2(
                travelSchedule.getTravelConsult().getConsultId());

        // 新数据固定 0
        travelSchedule.setIsDeleted(0);
        travelSchedule.setCreateTime(DateUtils.getNowDate());
        travelSchedule.setCreateBy(String.valueOf(SecurityUtils.getUserId()));
        travelSchedule.setUpdateBy(String.valueOf(SecurityUtils.getUserId()));
        return travelScheduleMapper.insertTravelSchedule(travelSchedule);
    }

    /**
     * 修改行程管理
     *
     * @param travelSchedule 行程管理
     * @return 结果
     */
    @Override
    public int updateTravelSchedule(TravelSchedule travelSchedule) {
        travelSchedule.setUpdateTime(DateUtils.getNowDate());
        travelSchedule.setUpdateBy(String.valueOf(SecurityUtils.getUserId()));
        return travelScheduleMapper.updateTravelSchedule(travelSchedule);
    }

    /**
     * 批量删除行程管理
     *
     * @param scheduleIds 需要删除的行程管理主键
     * @return 结果
     */
    @Override
    public int deleteTravelScheduleByScheduleIds(Long[] scheduleIds) {
        // 先查询所有行程（只查一次，提升效率）
        List<TravelSchedule> allSchedules = travelScheduleMapper.selectAll();
        System.out.println("所有行程: " + allSchedules);

        for (Long scheduleId : scheduleIds) {
            // 查询当前要删除的行程
            TravelSchedule targetSchedule = travelScheduleMapper.selectTravelScheduleByScheduleId(scheduleId);
            if (targetSchedule == null) {
                continue; // 跳过不存在的行程
            }
            Long targetConsultId = targetSchedule.getTravelConsult().getConsultId();
            System.out.println("当前删除的consultId: " + targetConsultId);

            boolean a = allSchedules.stream()
                    .filter(s -> !s.getScheduleId().equals(scheduleId)) // 排除自己
                    .anyMatch(s -> s.getTravelConsult() != null
                            && s.getTravelConsult().getConsultId().equals(targetConsultId)
                            && s.getIsDeleted() == 1);  //只要有一条 is_deleted=1
/*
将 allSchedules 列表转换为 Stream，以便进行链式操作。
排除当前要操作的行程（scheduleId 相同的行程），避免自我比较。
s.getTravelConsult() != null：确保行程关联的咨询单对象存在。
s.getTravelConsult().getConsultId().equals(targetConsultId)：检查咨询单 ID 是否与目标 ID 一致。
anyMatch：只要找到一个匹配项，立即返回 true；否则返回 false。
 */

            // 执行对应的删除方法
            if (a) {
                travelScheduleMapper.deleteTravelScheduleByScheduleId1(scheduleId);
            } else {
                travelScheduleMapper.deleteTravelScheduleByScheduleId(scheduleId);
            }
        }
        return scheduleIds.length;
    }

    /**
     * 删除行程管理信息
     *
     * @param scheduleId 行程管理主键
     * @return 结果
     */
    @Override
    public int deleteTravelScheduleByScheduleId(Long scheduleId) {
        // 先查询要删除的行程
        TravelSchedule targetSchedule = travelScheduleMapper.selectTravelScheduleByScheduleId(scheduleId);
        if (targetSchedule == null) {
            return 0; // 行程不存在，直接返回
        }

        // 获取目标行程的consultId
        Long targetConsultId = targetSchedule.getTravelConsult().getConsultId();

        // 查询所有行程（这里假设selectAll方法返回所有行程）
        List<TravelSchedule> allSchedules = travelScheduleMapper.selectAll();

        // 检查是否存在相同consultId的行程
        boolean hasSameConsultId = false;
        for (TravelSchedule schedule : allSchedules) {
            // 避免空指针异常，并检查consultId是否相同
            if (schedule.getTravelConsult() != null &&
                    schedule.getTravelConsult().getConsultId().equals(targetConsultId)) {
                hasSameConsultId = true;
                break;
            }
        }

        // 根据检查结果执行不同的删除方法
        if (hasSameConsultId) {
            return travelScheduleMapper.deleteTravelScheduleByScheduleId1(scheduleId);
        } else {
            return travelScheduleMapper.deleteTravelScheduleByScheduleId(scheduleId);
        }
    }

    @Override
    public List<TravelSchedule> selectConsultByDesignerId(TravelSchedule travelSchedule) {
        //把当前登录者id赋值为designerId
        TravelConsult tc=travelSchedule.getTravelConsult();
        tc.setDesignerId(SecurityUtils.getUserId());
        travelSchedule.setTravelConsult(tc);
        return travelScheduleMapper.selectConsultByDesignerId(travelSchedule);
    }


}
